TerraformでACM証明書を作成してみた
こんにちは、大阪オフィスの数枝です。
先日、TerraformにてACM証明書を作成する機会があったので、そのコードを共有いたします。とても簡単に作成することができました。
前提条件
- ALBで使用するACM証明書を発行します
- 検証方法はEメールではなくDNSです
- DNS検証ではCNAMEレコードを作成する必要がありますが、作成先のホストゾーンはRoute53で作成済みとします
- www.example.comというドメイン名で証明書を取得します
- Terraformとaws providerのバージョンは以下です
- Terraform v0.12.8
- provider.aws v2.27.0
コード
data aws_route53_zone route53-zone { name = "example.com." private_zone = false } resource aws_acm_certificate cert { domain_name = "www.example.com." validation_method = "DNS" } resource aws_route53_record cert_validation { zone_id = data.aws_route53_zone.route53-zone.zone_id name = aws_acm_certificate.cert.domain_validation_options[0].resource_record_name type = aws_acm_certificate.cert.domain_validation_options[0].resource_record_type records = [aws_acm_certificate.cert.domain_validation_options[0].resource_record_value] ttl = 60 } resource aws_acm_certificate_validation cert { certificate_arn = aws_acm_certificate.cert.arn validation_record_fqdns = [aws_route53_record.cert_validation.fqdn] } resource aws_lb_listener listener { //他パラメーター省略 certificate_arn = aws_acm_certificate.cert.arn }
解説
data aws_route53_zone route53-zone
data aws_route53_zone route53-zone { name = "example.com." private_zone = false }
Data Source はTerraform外(State外)で定義したリソースをTerraform内で参照可能にする機能です。今回の場合ホストゾーンをTerraform外で作成していますが、Terraform内で参照したかったのでこのaws_route53_zoneを使います。便利。zone_id
かname
が必須パラメーターです。
resource aws_acm_certificate cert
resource aws_acm_certificate cert { domain_name = "www.example.com." validation_method = "DNS" }
ACM証明書です。検証方法の指定はvalidation_method
で行ないますが、その中身については取り扱いません。
DNS検証を指定すると、Attributesでdomain_validation_options
が返ってきます。これを次のリソースで活用します。
resource aws_route53_record cert_validation
resource aws_route53_record cert_validation { zone_id = data.aws_route53_zone.route53-zone.zone_id name = aws_acm_certificate.cert.domain_validation_options[0].resource_record_name type = aws_acm_certificate.cert.domain_validation_options[0].resource_record_type records = [aws_acm_certificate.cert.domain_validation_options[0].resource_record_value] ttl = 60 }
ホストゾーン内にレコードを作成します。
ホストゾーンはData Sourceで参照可能にしたリソースのidを使います。あとは前段のaws_acm_certificate
のAttributesdomain_validation_options
の値の参照ばかりですね。
resource aws_acm_certificate_validation cert
resource aws_acm_certificate_validation cert { certificate_arn = aws_acm_certificate.cert.arn validation_record_fqdns = [aws_route53_record.cert_validation.fqdn] }
作ったACM証明書とCNAMEレコードの連携をします。
resource aws_lb_listener listener
resource aws_lb_listener listener { //他パラメーター省略 certificate_arn = aws_acm_certificate.cert.arn }
ALBとACM証明書の紐付けは、aws_lb_listener
のcertificate_arn
Argumentに証明書のARNを代入することでできます。
※Resource: aws_lb_listener_certificate というリソースもありますが、こちらは二つ目以降の証明書をALBに紐づける際に使用するものとのことです。